package com.laboratory.stream;


import com.laboratory.jdbc.User;
import org.apache.commons.lang.math.RandomUtils;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 使用stream排序
 */
public class SortTest {


    public static void main(String[] args) {
        //（一）方法引用与排序
        //普通数据类型
        // 正向排序（方法引用）
        Stream.of(11, 15, 11, 12).sorted(Integer::compareTo).forEach(System.out::println);
        // 正向排序
        Stream.of(11, 15, 11, 12).sorted(Comparator.naturalOrder()).forEach(System.out::println);
        // 逆向排序
        Stream.of(11, 15, 11, 12).sorted(Comparator.reverseOrder()).forEach(System.out::println);

        // 自定义数据类型
        // 数据完好.数据完好有两重含义，一是对象本身不为空；二是待比较对象的属性值不为空，以此为前提进行排序操作
        getUserList().stream().sorted(Comparator.comparingInt(User::getId)).forEach(System.out::println);
        System.out.println("----------------------------------------------------------------------------");
        List<User> userList = getUserList();
        Collections.sort(userList, Comparator.comparingInt(User::getId));
        userList.forEach(System.out::println);
        System.out.println("----------------------------------------------------------------------------");

        //数据缺失。
        // 数据缺失的含义是对象本身为空或者待比较对象属性为空，如果不进行处理，上述排序会出现空指针异常。 最常见的处理方式是通过流式运算中filter方法，过滤掉空指针数据，然后按照上述策略排序。
        List<User> collect = userList.stream().filter(user -> user.getAge() != null).collect(Collectors.toList());
        collect.sort(Comparator.comparingInt(User::getAge));
        collect.forEach(System.out::println);



    }


    public static List<User> getUserList() {
        List<User> list = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            User user = new User();
            user.setId(RandomUtils.nextInt(100));
            user.setName("张三" + i);
            if(i%2==0){
               user.setAge(RandomUtils.nextInt(80));
            }
            list.add(user);
        }
        return list;
    }

}
